/**
 * Create in 2012-4-8.
 */
package kit4j.common.task.executor;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import kit4j.common.task.Task;

/**
 * 多线程的任务执行器。所有提交到该执行器的任务在执行器启动后，每个任务单独使用一个新的线程执行。
 * 
 * @author MiniKnife
 *
 */
public class ConcurrentTaskExecutor extends AbstractTaskExecutor {
	
	/**
	 * 线程执行器。
	 */
	private ExecutorService executor;

	/**
	 * 创建一个多线程的任务执行器。
	 */
	public ConcurrentTaskExecutor() {
		executor = Executors.newCachedThreadPool();
	}

	/**
	 * @see kit4j.common.task.executor.AbstractTaskExecutor#runTask(kit4j.common.task.Task)
	 */
	@Override
	protected void runTask(final Task task) {
		runRunnable(new Runnable() {

			@Override
			public void run() {
				task.start();
			}
			
		});
	}
	
	/**
	 * 运行指定的Runnable对象。
	 * @param run 要运行的Runnable对象
	 */
	private void runRunnable(Runnable run) {
		executor.submit(run);
	}

	/**
	 * 暂停所有任务。
	 * 
	 * @see kit4j.common.task.executor.AbstractTaskExecutor#pause()
	 */
	@Override
	public void pause() {
		for(Task t : getTasks()) {
			t.pause();
		}
	}

	/**
	 * 继续所有任务。
	 * 
	 * @see kit4j.common.task.executor.AbstractTaskExecutor#resume()
	 */
	@Override
	public void resume() {
		for(Task t : getTasks()) {
			t.resume();
		}
	}

	/**
	 * 停止所有任务。
	 * 
	 * @see kit4j.common.task.executor.AbstractTaskExecutor#stop()
	 */
	@Override
	public void stop() {
		for(Task t : getTasks()) {
			t.stop();
		}
	}

}
